www.gusucode.com > VC++ Flash(SWF)文件创建生成Lib库源码+demo-源码程序 > VC++ Flash(SWF)文件创建生成Lib库源码+demo-源码程序/code/SWFLIB_Library/SWFColorTransform.cpp

    // SWFColorTransform.cpp: implementation of the CSWFColorTransform class.
//
//////////////////////////////////////////////////////////////////////

#include "SWFColorTransform.h"


CSWFColorTransform::CSWFColorTransform(SWF_COLOR_TRANSFORM* colorTransform)
{
	// Init members
	m_CXForm.Flags = 0;
	if (colorTransform != NULL)
	{
		m_CXForm.RedMultTerm = (USHORT)(colorTransform->RedMultTerm * 256);
		m_CXForm.GreenMultTerm = (USHORT)(colorTransform->GreenMultTerm * 256);
		m_CXForm.BlueMultTerm = (USHORT)(colorTransform->BlueMultTerm * 256);
		m_CXForm.AlphaMultTerm = (USHORT)(colorTransform->AlphaMultTerm * 256);
		m_CXForm.RedAddTerm = (USHORT)(colorTransform->RedAddTerm);
		m_CXForm.GreenAddTerm = (USHORT)(colorTransform->GreenAddTerm);
		m_CXForm.BlueAddTerm = (USHORT)(colorTransform->BlueAddTerm);
		m_CXForm.AlphaAddTerm = (USHORT)(colorTransform->AlphaAddTerm);
	}
	else
	{
		m_CXForm.RedMultTerm = m_CXForm.GreenMultTerm = m_CXForm.BlueMultTerm = m_CXForm.AlphaMultTerm = 0;
		m_CXForm.RedAddTerm = m_CXForm.GreenAddTerm = m_CXForm.BlueAddTerm = m_CXForm.AlphaAddTerm = 0;
	}
	m_SWFStream = NULL;
	m_SWFStreamLength = 0;
}

CSWFColorTransform::~CSWFColorTransform()
{
	if (m_SWFStream != NULL)
	{
		delete m_SWFStream;
		m_SWFStream = NULL;
	}
}

UCHAR* CSWFColorTransform::BuildSWFStream()
{
	int redAdd = abs((int)((short)abs(m_CXForm.RedAddTerm)));
	int greenAdd = abs((int)((short)abs(m_CXForm.GreenAddTerm)));
	int blueAdd = abs((int)((short)abs(m_CXForm.BlueAddTerm)));
	int alphaAdd = abs((int)((short)abs(m_CXForm.AlphaAddTerm)));
	int maxMultValue = max(max(abs(m_CXForm.RedMultTerm >> 8), abs(m_CXForm.GreenMultTerm >> 8)), max(abs(m_CXForm.BlueMultTerm >> 8), abs(m_CXForm.AlphaMultTerm >> 8)));
	int maxAddValue = max(max(redAdd >> 8, greenAdd >> 8), max(blueAdd >> 8, alphaAdd >> 8));
	int maxValue = max(maxMultValue, maxAddValue);
	UCHAR bitsNeaded = 0;
	int currentByte=0, bitOffset=0, i;

	// Calculate bits neaded
	while (pow(2, bitsNeaded) < maxValue)
		bitsNeaded++;
	bitsNeaded += 10;

	m_CXForm.Flags = (0x03 << 4) | bitsNeaded;

	// Create byte field
	m_SWFStreamLength = (8*bitsNeaded + 6) / 8;
	if ((8*bitsNeaded + 6) % 8 != 0)
		m_SWFStreamLength++;
	if (m_SWFStream != NULL)
		delete m_SWFStream;
	m_SWFStream = new UCHAR[m_SWFStreamLength];
	memset(m_SWFStream, 0, m_SWFStreamLength);

	// Set bits neaded
	m_SWFStream[currentByte] = (m_CXForm.Flags << 2);
	bitOffset = 6;

	// Write RedMultTerm bit-field
	currentByte = bitOffset / 8;
	USHORT redMultTerm = m_CXForm.RedMultTerm << (16 - bitsNeaded);
	USHORT maskRedMultTerm = 0x8000;
	for (i=0; i<bitsNeaded; i++)
	{
		m_SWFStream[currentByte] |= (((redMultTerm & maskRedMultTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1));

		bitOffset++;
		if ((bitOffset != 0) && (bitOffset % 8) == 0)
			currentByte++;

		maskRedMultTerm = maskRedMultTerm >> 1;
	}

	// Write GreenMultTerm bit-field
	currentByte = bitOffset / 8;
	USHORT greenMultTerm = m_CXForm.GreenMultTerm << (16 - bitsNeaded);
	USHORT maskGreenMultTerm = 0x8000;
	for (i=0; i<bitsNeaded; i++)
	{
		m_SWFStream[currentByte] |= (((greenMultTerm & maskGreenMultTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1));

		bitOffset++;
		if ((bitOffset != 0) && (bitOffset % 8) == 0)
			currentByte++;

		maskGreenMultTerm = maskGreenMultTerm >> 1;
	}

	// Write BlueMultTerm bit-field
	currentByte = bitOffset / 8;
	USHORT blueMultTerm = m_CXForm.BlueMultTerm << (16 - bitsNeaded);
	USHORT maskBlueMultTerm = 0x8000;
	for (i=0; i<bitsNeaded; i++)
	{
		m_SWFStream[currentByte] |= (((blueMultTerm & maskBlueMultTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1));

		bitOffset++;
		if ((bitOffset != 0) && (bitOffset % 8) == 0)
			currentByte++;

		maskBlueMultTerm = maskBlueMultTerm >> 1;
	}

	// Write AlphaMultTerm bit-field
	currentByte = bitOffset / 8;
	USHORT alphaMultTerm = m_CXForm.AlphaMultTerm << (16 - bitsNeaded);
	USHORT maskAlphaMultTerm = 0x8000;
	for (i=0; i<bitsNeaded; i++)
	{
		m_SWFStream[currentByte] |= (((alphaMultTerm & maskAlphaMultTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1));

		bitOffset++;
		if ((bitOffset != 0) && (bitOffset % 8) == 0)
			currentByte++;

		maskAlphaMultTerm = maskAlphaMultTerm >> 1;
	}

	// Write RedAddTerm bit-field
	currentByte = bitOffset / 8;
	USHORT redAddTerm = m_CXForm.RedAddTerm << (16 - bitsNeaded);
	USHORT maskRedAddTerm = 0x8000;
	for (i=0; i<bitsNeaded; i++)
	{
		m_SWFStream[currentByte] |= (((redAddTerm & maskRedAddTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1));

		bitOffset++;
		if ((bitOffset != 0) && (bitOffset % 8) == 0)
			currentByte++;

		maskRedAddTerm = maskRedAddTerm >> 1;
	}

	// Write GreenAddTerm bit-field
	currentByte = bitOffset / 8;
	USHORT greenAddTerm = m_CXForm.GreenAddTerm << (16 - bitsNeaded);
	USHORT maskGreenAddTerm = 0x8000;
	for (i=0; i<bitsNeaded; i++)
	{
		m_SWFStream[currentByte] |= (((greenAddTerm & maskGreenAddTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1));

		bitOffset++;
		if ((bitOffset != 0) && (bitOffset % 8) == 0)
			currentByte++;

		maskGreenAddTerm = maskGreenAddTerm >> 1;
	}

	// Write BlueAddTerm bit-field
	currentByte = bitOffset / 8;
	USHORT blueAddTerm = m_CXForm.BlueAddTerm << (16 - bitsNeaded);
	USHORT maskBlueAddTerm = 0x8000;
	for (i=0; i<bitsNeaded; i++)
	{
		m_SWFStream[currentByte] |= (((blueAddTerm & maskBlueAddTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1));

		bitOffset++;
		if ((bitOffset != 0) && (bitOffset % 8) == 0)
			currentByte++;

		maskBlueAddTerm = maskBlueAddTerm >> 1;
	}

	// Write AlphaAddTerm bit-field
	currentByte = bitOffset / 8;
	USHORT alphaAddTerm = m_CXForm.AlphaAddTerm << (16 - bitsNeaded);
	USHORT maskAlphaAddTerm = 0x8000;
	for (i=0; i<bitsNeaded; i++)
	{
		m_SWFStream[currentByte] |= (((alphaAddTerm & maskAlphaAddTerm) >> (15-i)) << ((currentByte+1)*8-bitOffset-1));

		bitOffset++;
		if ((bitOffset != 0) && (bitOffset % 8) == 0)
			currentByte++;

		maskAlphaAddTerm = maskAlphaAddTerm >> 1;
	}

	return m_SWFStream;
}

int CSWFColorTransform::GetSWFStreamLength()
{
	return m_SWFStreamLength;
}